/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
package br.jm.financeiro.relatorio;

import br.jm.financeiro.filter.Conecta;
import br.jm.financeiro.filter.UtilFaces;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer;
import net.sf.jasperreports.engine.fill.JRGzipVirtualizer;
import net.sf.jasperreports.view.JasperViewer;

/**
 *
 * @author joao
 */
public class ReportUtil {

    private String saida;

    //executa o relatório através de um JRBeanCollectionDataSource
    public void executarRelatorio(String nomeRelatorio, Map<String, Object> parametros) throws JRException, IOException, SQLException {

        FacesMessage msg = null;

        String caminho = "/WEB-INF/relatorios/";
        String relatorio = caminho.concat(nomeRelatorio);

        UtilFaces utilFaces = new UtilFaces();
        String arquivo = utilFaces.getServletContext().getRealPath(relatorio);
        String dirsub = utilFaces.getServletContext().getRealPath(caminho);

        Conecta conecta = new Conecta();

        JRAbstractLRUVirtualizer virtualizer = new JRGzipVirtualizer(100);

        try {
            parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
            parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));

            //Preenche o relatório e exibe numa GUI
            JasperPrint impressao = JasperFillManager.fillReport(arquivo, parametros, conecta.Conecta());
            //JasperViewer.viewReport(impressao, false);

            JasperViewer view = new JasperViewer(impressao, false);
            view.setTitle("Relatorio de Acionista");
            view.setZoomRatio(1.00F);
            view.setExtendedState(JasperViewer.MAXIMIZED_BOTH);
            view.setVisible(true);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Relatório Impresso com Sucesso", "");
        } finally {
            try {
                conecta.close();
            } catch (SQLException ex) {
                //Logger.getLogger(ReportUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void enviarPdf(String nomeRelatorio, Map<String, Object> parametros) throws JRException, IOException, SQLException {
        FacesContext context = FacesContext.getCurrentInstance();
        String caminho = "/WEB-INF/relatorios/";
        String relatorio = caminho.concat(nomeRelatorio);

        UtilFaces utilFaces = new UtilFaces();
        String arquivo = utilFaces.getServletContext().getRealPath(relatorio);
        String dirsub = utilFaces.getServletContext().getRealPath(caminho);

        Conecta conecta = new Conecta();

        JRAbstractLRUVirtualizer virtualizer = new JRGzipVirtualizer(100);
        // Carrega o xml de definição do relatório
        try {
            HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
            // Configura o response para suportar o relatório
            response.setContentType("application/pdf");
            response.addHeader("Content-disposition", "inline; filename=\"acionista.pdf\"");
            //response.addHeader("Content-disposition", "attachment; filename=\"acionista.pdf\"");

            // Preenche o relatório com os parametros e o data source
            parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
            parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));

            //Preenche o relatório e exibe numa GUI
            JasperPrint impressao = JasperFillManager.fillReport(arquivo, parametros, conecta.Conecta());
            // Exporta o relatório
            JasperExportManager.exportReportToPdfStream(impressao, response.getOutputStream());
            // Salva o estado da aplicação no contexto do JSF
            context.getApplication().getStateManager().saveView(context);
            // Fecha o stream do response
            context.responseComplete();
        } finally {
            try {
                conecta.close();
            } catch (SQLException ex) {
                //Logger.getLogger(ReportUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void executarRelatorio2(String nomeRelatorio, Map<String, Object> parametros) throws JRException, IOException, SQLException {
        FacesMessage msg = null;

        String caminho = "/WEB-INF/relatorios/";
        String relatorio = caminho.concat(nomeRelatorio);

        UtilFaces utilFaces = new UtilFaces();
        String arquivo = utilFaces.getServletContext().getRealPath(relatorio);
        String dirsub = utilFaces.getServletContext().getRealPath(caminho);

        Conecta conecta = new Conecta();

        JRAbstractLRUVirtualizer virtualizer = new JRGzipVirtualizer(100) {
        };

        try {
            parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
            parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));


            //Preenche o relatório e exibe numa GUI
            JasperPrint impressao = JasperFillManager.fillReport(arquivo, parametros, conecta.Conecta());

            preenchePdf(impressao);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Relatório Impresso com Sucesso", "");
        } finally {
            try {
                conecta.close();
            } catch (SQLException ex) {
                //Logger.getLogger(ReportUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    private void preenchePdf(JasperPrint print) throws JRException, IOException {
        // Pego o caminho completo do PDF desde a raiz
        saida = getDiretorioReal("/WEB-INF/relatorios/acionista.pdf");
        // Exporto para PDF
        JasperExportManager.exportReportToPdfFile(print, saida);

        java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
        desktop.open(new File(saida));
    }

    /**
	 * M?todo para retornar o caminho completo do diret?rio onde se encontra o 
	 * arquivo 'jasper' e o arquivo 'pdf'
	 *  
	 * @param diretorio String diret?rio a ser localizado na aplica??o
	 * @return String caminho completo
	 */
    private String getDiretorioReal(String diretorio) {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        return session.getServletContext().getRealPath(diretorio);
    }

    /**
	 * M?todo para retornar o nome da aplica??o
	 *  
	 * @return String nome da aplicacao 
	 */
    private String getContextPath() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        return session.getServletContext().getContextPath();
    }

    public String getSaida() {
        return saida;
    }

    public void setSaida(String saida) {
        this.saida = saida;
    }
}
